📝 Резюме · 📄 Оригинал (1.2 KB)
https://t.me/Python_libr/3363

Модуль user_agents в Python

Источник: https://t.me/Python_libr/3363


Что такое User Agent?

User Agent — это строка, которую браузер отправляет на сервер в заголовке HTTP запроса. Содержит информацию об устройстве, операционной системе, браузере и его версии. Пример:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

Почему нужен модуль user_agents?

Парсинг User Agent строк вручную — это кошмар. Модуль user_agents упрощает этот процесс, предоставляя удобный API для извлечения информации об устройстве.

Установка

pip install user-agents

Базовое использование

from user_agents import parse

# Парсим User Agent строку
ua_string = (
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 Chrome/91.0.4472.124 Safari/537.36'
)

user_agent = parse(ua_string)

# Информация о браузере
print(user_agent.browser.family)        # Chrome
print(user_agent.browser.version_string) # 91.0.4472.124

# Информация об ОС
print(user_agent.os.family)             # Windows
print(user_agent.os.version_string)     # 10

# Информация об устройстве
print(user_agent.device.family)         # Other
print(user_agent.device.brand)          # None
print(user_agent.device.model)          # None

# Проверки
print(user_agent.is_mobile)             # False
print(user_agent.is_tablet)             # False
print(user_agent.is_pc)                 # True

Примеры разных User Agent'ов

from user_agents import parse

# Мобильный телефон
mobile_ua = (
    'Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) '
    'AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 '
    'Mobile/15E148 Safari/604.1'
)

mobile = parse(mobile_ua)
print(mobile.is_mobile)        # True
print(mobile.os.family)        # iOS
print(mobile.browser.family)   # Mobile Safari

# Планшет
tablet_ua = (
    'Mozilla/5.0 (iPad; CPU OS 14_7_1 like Mac OS X) '
    'AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 '
    'Mobile/15E148 Safari/604.1'
)

tablet = parse(tablet_ua)
print(tablet.is_tablet)        # True
print(tablet.device.family)    # iPad

Практическое применение

Аналитика трафика

from django.http import HttpResponse
from user_agents import parse

def analytics_view(request):
    # Получаем User Agent из request
    user_agent = parse(request.META.get('HTTP_USER_AGENT', ''))

    # Логируем информацию о посетителе
    Analytics.objects.create(
        user_id=request.user.id if request.user.is_authenticated else None,
        browser=user_agent.browser.family,
        browser_version=user_agent.browser.version_string,
        os=user_agent.os.family,
        is_mobile=user_agent.is_mobile,
        is_tablet=user_agent.is_tablet,
        device_type='mobile' if user_agent.is_mobile else 'desktop'
    )

    return HttpResponse('OK')

Дифференцированное отображение контента

def content_view(request):
    user_agent = parse(request.META.get('HTTP_USER_AGENT', ''))

    # Показываем мобильную версию для телефонов
    if user_agent.is_mobile:
        template = 'mobile_version.html'
    # Облегченная версия для планшетов
    elif user_agent.is_tablet:
        template = 'tablet_version.html'
    # Полная версия для десктопа
    else:
        template = 'desktop_version.html'

    return render(request, template)

Защита от ботов

def api_endpoint(request):
    user_agent = parse(request.META.get('HTTP_USER_AGENT', ''))

    # Блокируем подозрительные боты
    bot_signatures = ['bot', 'crawler', 'spider', 'scraper']

    ua_lower = user_agent.browser.family.lower()

    if any(bot_sig in ua_lower for bot_sig in bot_signatures):
        return JsonResponse(
            {'error': 'Bot access denied'},
            status=403
        )

    # Обрабатываем запрос
    return JsonResponse({'data': 'OK'})

Диаграмма парсинга

graph LR
    A["HTTP Request<br/>с User Agent"] --> B["user-agents<br/>парсер"]
    B --> C["Browser<br/>family, version"]
    B --> D["OS<br/>family, version"]
    B --> E["Device<br/>brand, model, type"]
    C --> F["is_mobile<br/>is_tablet<br/>is_pc"]

Все доступные атрибуты

user_agent = parse(ua_string)

# Browser
user_agent.browser.family
user_agent.browser.version_string

# OS
user_agent.os.family
user_agent.os.version_string

# Device
user_agent.device.family        # iPhone, iPad, etc
user_agent.device.brand         # Apple, Samsung, etc
user_agent.device.model         # iPhone 12, Galaxy S21, etc

# Логические проверки
user_agent.is_mobile            # Boolean
user_agent.is_tablet            # Boolean
user_agent.is_pc                # Boolean
user_agent.is_bot               # Boolean

Лучшие практики

  1. Кешируйте результаты парсинга для высоконагруженных приложений
  2. Комбинируйте с IP геолокацией для полного профиля пользователя
  3. Регулярно обновляйте базу данных User Agent'ов
  4. Не полагайтесь только на User Agent для определения устройства
  5. Логируйте аномальные User Agent'ы для выявления новых ботов